package com.tedu.api.io;

import org.junit.Test;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

/**
 * IO:传输数据    C/S  聊天室  Version
 * API上部分：字符串、包装类、日期类、集合
 * ----------电脑有三大件：CPU、硬盘、内存
 * API上部分：IO流        -----硬盘-----文件传输数据
 *
 * 包位置：java.io
 * File文件：文件夹类
 * 作用：用于表示操作系统中系统的一个文件或者“目录：文件夹“
 * 创建File对象--->有参构造器--->"路径+文件/文件夹全称”
 *
 * File类方法使用：
 * 1.查看该文件或者”文件夹：目录“的属性信息（名字、大小、是否存在）
 * 2.操作文件或者”文件夹：目录“（创建、删除）
 * 3.访问一个”文件夹：目录“的子项
 */
public class FileAPI {
    @Test
    public void testFile(){
    //创建文件夹类
    //需求：当前API下创建文件----手动----demo.txt  char r='\\'
    /* File file=new File("D:\\javaapi\\API\\src\\main"+
    "\\java\\com\\tedu\\api\\io\\demo.txt"); */
    //相对路径---当前API下创建文件！  项目：Maven结构 main编写代码
    //FileAPI   相对于  API项目下 --->从src开始
    //操作系统：路径   \代表路径   文件上传至服务器
    //               /代表路径   文件下载到本地
    //Java任何平台【操作系统】运行  统一路径属性
    File file=new File("src"+File.separator+"main"+
            ""+File.separator+"java"+
            ""+File.separator+"com"+
            ""+File.separator+"tedu"+
            ""+File.separator+"api"+
            ""+File.separator+"io"+""+File.separator+"demo.txt");
    //判断文件是否存在方法
    boolean b=file.exists();
    System.out.println("判断文件是否存在："+b);

    }

    /**
     * 查看文件或者文件夹的属性信息：
     * getName()    返回值:String
     * 作用：获取文件或者文件的名字【注意：不看路径是否正确】
     * length()     返回值：long
     * 作用：返回当前文件的大小【字节量】
     * exists()     返回值：boolean
     * 作用：判断文件是否存在
     */
    @Test
    public void testFileGL() throws IOException {
    //创建文件夹---路径：Maven项目---相对路径
    //相对路径：./  当前项目下
    File file=new File("."+
            ""+File.separator+"demo.txt");
    //打印 file 的路径
    System.out.println("打印file路径："+file.getCanonicalPath());
    //文件是否存在
    System.out.println("路径文件是否存在："+file.exists());
    //获取文件名字
    String name=file.getName();
    System.out.println("文件或者文件夹的名字"+name);
    //获取文件的“大小：字节量”
    long len=file.length();
    System.out.println("获取文件大小【字节量】："+len);
    }
    /**
     * 使用代码完成文件或者目录自动创建
     * createnewFile()
     * 作用：创建一个新文件
     * 需求：使用代码完成API 项目文件下  自动创建  test.txt文件
     */
    @Test
    public void testCreat() throws IOException {
    //创建文件夹：路径+全称   ./test.txt
    File file=new File("."+
            ""+File.separator+"test.txt");
    //判断---如果文件不存在---创建
    //      如果文件存在-----不创建
    if (!file.exists()){
        System.out.println("文件不存在~~");
        file.createNewFile();
        System.out.println("文件已经创建~");
    }else{
        System.out.println("文件存在，别创建了~");
    }
    }
    /**
     * delete()
     * 作用：删除文件或者文件夹
     * 需求：将API项目下的 test.txt删除
     */
    @Test
    public void testDelete(){
    //创建File类 路径：./test.txt   ./不写代表   当前API项目
    File file=new File("test.txt");
    //判断如果文件  存在--->删除
    //            不存在--->删除
    if(file.exists()){
    System.out.println("文件存在");
    file.delete();
     System.out.println("文件删除~");
     }else{
     System.out.println("文件已经删除了~");
        }
    }
    /**
     * mkdir()
     * 作用：创建一个文件夹
     * 需求：在API  项目下创建一个文件夹 demo
     *
     * 多层文件夹：demo/abc/bcd
     * mkdirs()
     * 作用：创建多层文件夹
     * 不需要exists判断
     * 思路：找到每一段路径【bcd删除完毕--abc删除完毕-demo】
     */
    @Test
    public void testHomeWork1(){
    //1.创建多层文件夹 demo/abc/bcd
    File parent=new File("demo");
    //构造器使用(父级路径，子级路径)：父级路径/子级路径
    File child1=new File(parent,"abc");
    File child2=new File(child1,"bcd");

    child2.delete();//删除bcd
    child1.delete();//删除abc
    parent.delete();//删除demo
    //作业2：提示--创建FileFilter接口--匿名内部类
    /*FileFilter ff=new FileFilter(){
    public boolean accept(File pathname) {
    return false;
            }
        };*/
    parent.listFiles(new FileFilter(){
        public boolean accept(File pathname) {
            return false;
        }
    });
    }


    @Test
    public void testMkdir(){
    //创建File文件/文件夹--->创建demo文件夹
    File file=new File("demo"+
            ""+File.separator+"abc"+
            ""+File.separator+"bcd");
    //判断 如果文件不存在---创建文件夹
    //            存在---不创建
    if(!file.exists()){
    System.out.println("文件夹不存在~");
    file.mkdirs();
    System.out.println("创建文件夹~");
    } else{
    System.out.println("别创建了~");
    }
    }
    /**
     * 作业1：删除多层文件夹demo/abc/bcd【不能使用递归】
     * 提示：构造器 new File (File parent,"子路径")
     *      不需要exists判断
     * 思路：找到每一级路径【bcd删除完毕--abc删除完毕-demo】
     */

    /**
     * 访问文件夹--->所有子项【文件夹和文件】
     * listFiles()  返回值：File[]    文件数组
     * 作用：获取文件夹的所有子项【包含文件夹和文件】
     * isFile()  返回值：boolean
     * 作用：判断是否为文件，是文件true，反之
     * isDirectory  返回值：boolean
     * 作用：判断是否为文件夹、是文件夹true，反之
     * 需求：获取API 项目下 所有的文件夹文字
     */
    @Test
    public void test() throws IOException {
    File file=new File("."+File.separator);
    System.out.println(file.getCanonicalFile());
    //过滤：3个文件夹还有4个文件夹，过滤是文件夹
    if (file.isDirectory()){   //-----过滤没有效果-----
    //获取到所有的文件夹
    File[] dir=file.listFiles();
    //遍历所有文件夹名称
    for (int i=0;i<dir.length;i++){//   i   拿到所以下标
    //打印文件夹名字
    System.out.println(dir[i].getName());
    }
    }
    }
}
